package com.wyw.function.learning.demo6;

import com.wyw.function.learning.common.Dish;
import com.wyw.function.learning.common.DishClient;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @Title   用流收集数据
 * @Description 分区
 * @Author Mr Wu yewen.wu.china@gmail.com
 * Update History:
 * Author        Time            Content
 */
public class DemoClient15 {

    /**
     * 分区是分组的特殊情况：由一个谓词（返回一个布尔值的函数）作为分类函数，它成为分区函数。
     * 分区函数返回一个布尔值，这意味着得到的分组Mao的键类型是Boolean，于是它最多分为两组——true是一组，false是一组
     * 把菜单按照素食和非素食分开
     */
//    public static void main(String[] args) {
//        List<Dish> menu = DishClient.getMenu();
//        Map<Boolean, List<Dish>> collect =
//                menu.stream().collect(Collectors.partitioningBy(Dish::isVegetarian));
//        System.out.println(collect);
//    }

    /**
     * 分区的好处在于保留了分区函数返回true或false的两套流元素列表
     * 分区内再分区
     */
    public static void main(String[] args) {
        List<Dish> menu = DishClient.getMenu();
        Map<Boolean, Map<Boolean, List<Dish>>> collect = menu.stream()
                .collect(
                        Collectors.partitioningBy(
                                Dish::isVegetarian,
                                Collectors.partitioningBy(dish -> dish.getCalories() > 500)
                        )
                );
        System.out.println(collect);
    }

}
